<?php
/**
 * 检测用户是否登录
 * @return integer 0-未登录，大于0-当前登录用户ID
 */
function is_login()
{
    $user = session('user_auth');
    if (empty($user)) {
        return 0;
    } else {
        return $user['id'];
    }
}

/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list, $field, $sortby = 'asc')
{
    if (is_array($list)) {
        $refer = $resultSet = array();
        foreach ($list as $i => $data)
            $refer[$i] = &$data[$field];
        switch ($sortby) {
            case 'asc': // 正向排序
                asort($refer);
                break;
            case 'desc':// 逆向排序
                arsort($refer);
                break;
            case 'nat': // 自然排序
                natcasesort($refer);
                break;
        }
        foreach ($refer as $key => $val)
            $resultSet[] = &$list[$key];
        return $resultSet;
    }
    return false;
}
/**
 * 把返回的数据集转换成Menu_Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @return array
 */
function list_to_menu_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    // 创建Tree
    $tree = array();
    if (is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] = new \Common\Common\Menu($list[$key]);
        }

        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = $data[$pid];
            if ($root == $parentId) {
                $tree[] =&$refer[$data[$pk]];
            } else {
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $menu=new \Common\Common\Menu($list[$key]);
                    $menu->set_parent($parent);
//                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}
/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @return array
 */
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    // 创建Tree
    $tree = array();
    if (is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            } else {
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}

/**
 * 将list_to_tree的树还原成列表
 * @param  array $tree 原来的树
 * @param  string $child 孩子节点的键
 * @param  string $order 排序显示的键，一般是主键 升序排列
 * @param  array $list 过渡用的中间数组，
 * @return array        返回排过序的列表数组
 */
function tree_to_list($tree, $child = '_child', $order = 'id', &$list = array())
{
    if (is_array($tree)) {
        $refer = array();
        foreach ($tree as $key => $value) {
            $reffer = $value;
            if (isset($reffer[$child])) {
                unset($reffer[$child]);
                tree_to_list($value[$child], $child, $order, $list);
            }
            $list[] = $reffer;
        }
        $list = list_sort_by($list, $order, $sortby = 'asc');
    }
    return $list;
}

/**
 * 设置跳转页面URL
 * 使用函数再次封装，方便以后选择不同的存储方式（目前使用cookie存储）
 */
function set_redirect_url($url)
{
    cookie('redirect_url', $url);
}

/**
 * 获取跳转页面URL
 * @return string 跳转页URL
 */
function get_redirect_url()
{
    $url = cookie('redirect_url');
    return empty($url) ? __APP__ : $url;
}

function get_params($key, $post = true)
{
    if ($post) {
        $value = $_POST[$key];
        if (empty($value)) {
            $value = $_GET[$key];
        }
        return $value;
    } else {
        $value = $_GET[$key];
        if (empty($value)) {
            $value = $_POST[$key];
        }
        return $value;
    }
}

/**
 * 获取id
 * @return string 跳转页URL
 */
function get_ids($list, $key = 'id')
{
    $ids = "";
    if (is_array($list)) {
        foreach ($list as $value) {
            $ids .= $value["id"] . ",";
        }
    }
    $ids = $ids ? substr($ids, 0, strlen($ids) - 1) : "";
    return $ids;
}

function searchArray($array, $key, $value)
{
    if ($array != null && count($array) > 0) {
        foreach ($array as $arr) {
            if ($arr["$key"] == $value) {
                return $arr;
            }
        }
    }
    return null;
}

function sumArray($array, $key)
{
    $sum = 0;
    if ($array != null && count($array) > 0) {
        foreach ($array as $arr) {
            $sum += $arr["$key"];
        }
    }
    return $sum;
}

function searchArrayList($array, $key, $value)
{
    $arrs = array();
    if ($array != null) {
        foreach ($array as $index => $arr) {
            if ($arr["$key"] == $value) {
                //$arrs[$index] = $arr;
                $arrs[] = $arr;
            }
        }
    }
    return $arrs;
    //return array_merge($arrs);
}

/**
 * 把数组按指定的个数分隔
 * @param array $array 要分割的数组
 * @param int $groupNum 分的组数
 * @return array
 */
function splitArray($array, $groupNum)
{
    if (empty($array)) return array();

    //数组的总长度
    $allLength = count($array);

    //个数
    $groupNum = intval($groupNum);

    //开始位置
    $start = 0;

    //分成的数组中元素的个数
    $enum = (int)($allLength / $groupNum);

    //结果集
    $result = array();

    if ($enum > 0) {

        //被分数组中 能整除 分成数组中元素个数 的部分
        $firstLength = $enum * $groupNum;
        $firstArray = array();
        for ($i = 0; $i < $firstLength; $i++) {
            array_push($firstArray, $array[$i]);
            unset($array[$i]);
        }
        for ($i = 0; $i < $groupNum; $i++) {

            //从原数组中的指定开始位置和长度 截取元素放到新的数组中
            $result[] = array_slice($firstArray, $start, $enum);

            //开始位置加上累加元素的个数
            $start += $enum;
        }
        //数组剩余部分分别加到结果集的前几项中
        $secondLength = $allLength - $firstLength;
        for ($i = 0; $i < $secondLength; $i++) {
            array_push($result[$i], $array[$i + $firstLength]);
        }
    } else {
        for ($i = 0; $i < $allLength; $i++) {
            $result[] = array_slice($array, $i, 1);
        }
    }
    return $result;
}

function splitNumByPercent($num, $percent)
{
    if (empty($num)) return array();

    //总数
    $num = intval($num);

    //个数
    $groupNum = count($percent);

    $result = array();

    foreach ($percent as $p) {
        $result[] = floor($num * $p / 100);
    }
    $remainder = $num - array_sum($result);

    if ($remainder > 0) {
        for ($i = 0; $i < $remainder; $i++) {
            $l = $i % $groupNum;
            $result[$l]++;
        }
    }
    return $result;
}

/**创建GUID，类似：5DDB650F-4389-F4A9-A100-501EF1348872
 * @return string
 */
function uuid()
{
    if (function_exists('com_create_guid')) {
        return com_create_guid();
    } else {
        mt_srand(( double )microtime() * 10000); //optional for php 4.2.0 and up.随便数播种，4.2.0以后不需要了。
        $charid = strtoupper(md5(uniqid(rand(), true))); //根据当前时间（微秒计）生成唯一id.
        $hyphen = chr(45); // "-"
        $uuid = '' . //chr(123)// "{"
            substr($charid, 0, 8) . $hyphen . substr($charid, 8, 4) . $hyphen . substr($charid, 12, 4) . $hyphen . substr($charid, 16, 4) . $hyphen . substr($charid, 20, 12);
        //.chr(125);// "}"
        return $uuid;
    }
}

function md5_encrypt($str)
{
    if (C('ENVIRONMENT') == 'debug') {
        return $str;
    }
    return md5($str);
}

/**
 *扩展的函数
 */
include_once 'function_cache.php';
include_once 'function_ext.php';
include_once 'function_authorize.php';
